<template>
  <a-modal
    title="新增代码生成配置"
    :width="900"
    :visible="visible"
    :confirmLoading="confirmLoading"
    @ok="handleSubmit"
    @cancel="handleCancel">
    <a-spin :spinning="confirmLoading">
      <a-form :form="form">
         <a-row :gutter="24">
          <a-col :md="12" :sm="24">
            <a-form-item :labelCol="labelCol" :wrapperCol="wrapperCol" label="生成库" has-feedback>
               <a-select
                style="width: 100%"
                placeholder="请选择数据库"
                v-decorator="['databaseName', {rules: [{ required: true, message: '请选择数据库！' }]}]">
                <a-select-option
                  v-for="(item,index) in databaseNameData"
                  :key="index"
                  :value="item.databaseName"
                  @click="databaseNameSele(item)">{{ item.databaseName }}</a-select-option>
              </a-select>
            </a-form-item>
          </a-col>
          <a-col :md="12" :sm="24">
            <a-form-item label="业务名" :labelCol="labelCol" :wrapperCol="wrapperCol" has-feedback>
              <a-input
                placeholder="请输入业务名"
                v-decorator="['busName', {rules: [{required: true, message: '请输入业务名！'}]}]" />
            </a-form-item>
          </a-col>
          <a-col :md="12" :sm="24">
            <a-form-item :labelCol="labelCol" :wrapperCol="wrapperCol" label="菜单分类" has-feedback>
              <a-select
                style="width: 100%"
                placeholder="请选择应用分类"
                v-decorator="['menuApplication', {rules: [{ required: true, message: '请选择应用分类！' }]}]">
                <a-select-option
                  v-for="(item,index) in appData"
                  :key="index"
                  :value="item.code"
                  @click="changeApplication(item.code)">{{ item.name }}</a-select-option>
              </a-select>
            </a-form-item>
          </a-col>
          <a-col :md="12" :sm="24">
            <div>
              <a-form-item :labelCol="labelCol" :wrapperCol="wrapperCol" label="父级菜单" has-feedback>
                <a-tree-select
                  v-decorator="['menuPid', {rules: [{ required: true, message: '请选择父级菜单！' }]}]"
                  style="width: 100%"
                  :dropdownStyle="{ maxHeight: '300px', overflow: 'auto' }"
                  :treeData="menuTreeData"
                  placeholder="请选择父级菜单"
                  treeDefaultExpandAll>
                  <span slot="title" slot-scope="{ id }">{{ id }}
                  </span>
                </a-tree-select>
              </a-form-item>
            </div>
          </a-col>
          <a-col :md="12" :sm="24">
            <a-form-item label="命名空间" :labelCol="labelCol" :wrapperCol="wrapperCol" has-feedback>
              <a-input
                placeholder="请输入代码包名"
                v-decorator="['nameSpace', {rules: [{required: true, message: '请输入命名空间！'}]}]" />
            </a-form-item>
          </a-col>
          <a-col :md="12" :sm="24">
            <a-form-item label="作者姓名" :labelCol="labelCol" :wrapperCol="wrapperCol" has-feedback>
              <a-input
                placeholder="请输入作者姓名"
                v-decorator="['authorName', {rules: [{required: true, message: '请输入作者姓名！'}]}]" />
            </a-form-item>
          </a-col>
          <a-col :md="12" :sm="24">
            <a-form-item :labelCol="labelCol" :wrapperCol="wrapperCol" label="生成方式">
              <a-radio-group v-decorator="['generateType',{rules: [{ required: true, message: '请选择生成方式！' }]}]">
                <a-radio
                  v-for="(item,index) in generateTypeData"
                  :key="index"
                  :value="item.code"
                  @click="generateTypeRadio(item.code)">{{ item.name }}</a-radio>
              </a-radio-group>
            </a-form-item>
          </a-col>
        </a-row>
      </a-form>
    </a-spin>
  </a-modal>
</template>

<script>
  import {
    getAppList
  } from '@/api/modular/system/appManage'
  import {
    getMenuTree
  } from '@/api/modular/system/menuManage'
  import { codeGenerateDatabaseList } from '@/api/modular/gen/codeGenerateManage'
  import { lowCodeAdd } from '@/api/modular/gen/lowCodeManage'
  export default {
    data() {
      return {
        labelCol: {
          xs: {
            span: 24
          },
          sm: {
            span: 5
          }
        },
        wrapperCol: {
          xs: {
            span: 24
          },
          sm: {
            span: 15
          }
        },
        visible: false,
        appData: [],
        menuTreeData: [],
        databaseNameData:[],
        // tablePrefixData: [],
        generateTypeData: [],
        confirmLoading: false,
        // tablePrefixValue: 'N',
        databaseNameValue:'',
        tableNameValue: '',
        form: this.$form.createForm(this)
      }
    },
    methods: {
      // 初始化方法
      add() {
        this.visible = true
        this.codeGenerateDatabaseList()
       // 多库默认需要选择后调用
       // this.codeGenerateInformationList() 
        this.dataTypeItem()
        this.selectedByDefault()

        // 获取系统应用列表
        this.getSysApplist()
      },
      /**
       * 默认选中项
       */
      selectedByDefault() {
        this.form.getFieldDecorator('nameSpace', {
          initialValue: 'Admin.NET.Application'
        })
        // this.form.getFieldDecorator('tablePrefix', { valuePropName: 'checked', initialValue: 'N' })
        this.form.getFieldDecorator('generateType', {
          valuePropName: 'checked',
          initialValue: '2'
        })

        // 初始化菜单默认选择
        this.form.getFieldDecorator('menuApplication', {
          initialValue: 'busiapp'
        })
        this.changeApplication('busiapp')
      },
       /**
       * 获得所有数据库
       */
      codeGenerateDatabaseList() {
        codeGenerateDatabaseList().then((res) => {
          this.databaseNameData = res.data
        })
      },
      /**
       * 获得菜单所属应用
       */
      getSysApplist() {
        return getAppList().then((res) => {
          if (res.success) {
            this.appData = res.data
          } else {
            this.$message.warning(res.message)
          }
        })
      },
      /**
       * 获取字典数据
       */
      dataTypeItem() {
        this.tablePrefixData = this.$options.filters['dictData']('yes_or_no')
        this.generateTypeData = this.$options.filters['dictData']('code_gen_create_type')
        this.generateTypeData.splice(0, 1) // 默认去掉从压缩包下载
      },
      /**
       * 提交表单
       */
      handleSubmit() {
        const {
          form: {
            validateFields
          }
        } = this
        validateFields((errors, values) => {
          if (!errors) {
            this.confirmLoading = true
            lowCodeAdd(values).then((res) => {
              if (res.success) {
                this.$message.success('新增成功')
                this.$emit('ok', values)
                this.handleCancel()
              } else {
                this.$message.error('新增失败：' + res.message)
              }
            }).finally((res) => {
              this.confirmLoading = false
            })
          }
        })
      },
      handleCancel() {
        this.form.resetFields()
        this.visible = false
        // 清空他们三个
        this.form.getFieldDecorator('className', {
          initialValue: ''
        })
        this.form.getFieldDecorator('busName', {
          initialValue: ''
        })
        // this.form.getFieldDecorator('tableComment', { initialValue: '' })
      },
       /**
       * 选择数据库
       */
      databaseNameSele(item) {
        this.databaseNameValue = item.databaseName
        // this.form.getFieldDecorator('tableComment', { initialValue: item.tableComment })
        //this.form.getFieldDecorator('busName', {
        //  initialValue: item.databaseComment
        //})
        // this.settingDefaultValue()
        // this.form.getFieldDecorator('tableName', {
        //  //X initialValue: ''
        //  //X defaultValue:''
        //  //X value:''
        // }) 这个方法不起作用
        this.form.setFieldsValue({'tableName':''}); //这个OK
        //this.codeGenerateInformationList({ dbContextLocatorName:this.databaseNameValue});
      },
      /**
       * 选择数据库列表
       */
      tableNameSele(item) {
        this.tableNameValue = item.tableName
        // this.form.getFieldDecorator('tableComment', { initialValue: item.tableComment })
        this.form.getFieldDecorator('busName', {
          initialValue: item.tableComment
        })
        this.settingDefaultValue()
      },
      /**
       * 菜单所属应用change事件
       */
      changeApplication(value) {
        getMenuTree({
          'application': value
        }).then((res) => {
          if (res.success) {
            this.menuTreeData = [{
              'id': '-1',
              'parentId': '0',
              'title': '顶级',
              'value': '0',
              'pid': '0',
              'children': res.data
            }]
            this.form.getFieldDecorator('menuPid', {
              initialValue: '0'
            })
          } else {
            this.$message.warning(res.message)
          }
        })
      },
      // /**
      //  * 选择是否移除前缀触发
      //  */
      // tablePrefixRadio (tablePrefixType) {
      //   this.tablePrefixValue = tablePrefixType
      //   this.settingDefaultValue()
      // },
      /**
       * 设置默认值
       */
      settingDefaultValue() {
        // const tableName = this.classNameToHump()
        // this.form.getFieldDecorator('className', { initialValue: tableName })
        // this.form.getFieldDecorator('busName', { initialValue: tableName + "业务"})
      },
      /**
       * 选择生成方式
       */
      generateTypeRadio(generateType) {
        // if (generateType === '1') {
        //   this.packageNameShow = true
        // } else {
        //   this.packageNameShow = false
        //   this.form.setFieldsValue({ nameSpace: 'Admin.NET.Application' })
        // }
      }
    }
  }
</script>
